[Xamarin.Mac] ウインドウを表示してみました
1 はじめに
CX事業本部の平内(SIN)です。
Xamarin.Macを使用すると、C#でネイティブなMacのアプリが作成可能です。 ここでは、私自身がXamarin.Macに入門して学習した事項を覚書として書かせて頂いています。
今回は、別のウインドウを表示してみました。
2 ウインドウ作成
新しくウインドウを作成するには、ストーリーボードでView Controllerを配置します。
サイズ調整や表示位置は、プロパティの設定で行えます。
とりあえず、メインとなるウインドウに配置したボタンからsegueで繋ぎます。
これで、ボタンを押して別ウインドウを表示する事ができます。
3 Segueの種類
Segueのkindを変更する事で、ウインドウの表示方法が変わります。
(1) Modal
アクセスできるのは、新しく表示されたウインドウのみになります。
(2) Show
Modalと違い、別のウインドウへのアクセス可能であるため、ボタンを押すごとに新しくウインドウが表示されます。
(3) Sheet
(4) Popover
Popoverは、別途設定で表示方法が設定可能です。
4 カスタムクラス
ウインドウのクラス指定で、名前をつける事で、C#からアクセス可能になります。
名前を付けると、XCode上でクラスが生成されるのと同時に、Xamarin.Macでもクラスが追加されていることを確認できます。
カスタムクラスも、コントロールのOutlookやActionを関連付けてC#からアクセスします。
ウインドウ(自身)を閉じるコード例です。
namespace Sample003 { public partial class SampleView : NSViewController { public SampleView(IntPtr handle) : base(handle) { } partial void onClickButton(NSObject sender) { DismissController(this); // 自身を閉じる } } }
5 遷移時の相互アクセス
PrepareForSegueをoverrideすることで、遷移時に遷移先のViewにアクセス可能です。遷移先で公開されたプロパティにアクセスすることで、データの受け渡しなどが可能です。(この時点では、新しいビューは表示されていないので、コントロールを直接操作することはできません。)
<br />[Export("prepareForSegue:sender:")] public void PrepareForSegue(NSStoryboardSegue segue, NSObject sender) { var sampleView = segue.DestinationController as SampleView; }
モーダルなウインドウを表示した場合、「それが閉じられた際のイベントを処理したい」というような要求はあると思います。 この場合の実装の一例は、以下のようになります。
- 親となるウインドウで、閉じた際に実行したいメソッド定義する
public partial class ViewController : NSViewController { public void OnClose() { } }
- 子ウインドウ側では、PresentingViewControllerで親にアクセスして、定義したメソッドをコールする
public partial class SampleView : NSViewController { partial void onClickButton(NSObject sender) { var parentVC = this.PresentingViewController as ViewController; parentVC.OnClose(); // 親ウインドウのメソッドを呼び出す DismissController(this); // 自身を閉じる } }
6 最後に
今回は、ウインドウの表示について確認してみました。
ウインドウの生成や遷移は、コードで書くのか、ストーリーボードで書くのか悩ましい問題があります。また、その要領も多数存在します。
個人の趣味や、考え方にもよると思いますが、少し大きなプログラムになるなら、どこで処理されているか混乱しないよう、できるだけ整理して実装することが重要だと思います。